home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / pascal / totsrc.zip / TOTMENU.INC < prev    next >
Text File  |  1991-02-11  |  14KB  |  606 lines

  1. {               Copyright 1991 TechnoJock Software, Inc.               }
  2. {                          All Rights Reserved                         }
  3. {                         Restricted by License                        }
  4.  
  5. {File TOTMENU.INC}
  6.  
  7. {|||||||||||||||||||||||||||||||||||||||||||||||}
  8. {                                               }
  9. {     B a s e M e n u O B J   M E T H O D S     }
  10. {                                               }
  11. {|||||||||||||||||||||||||||||||||||||||||||||||}
  12. constructor BaseMenuOBJ.Init;
  13. {}
  14. begin
  15.    vItemStack := nil; 
  16.    vTotalItems := 0;
  17.    vActiveItem := 0;
  18.    vAllowEsc := true;
  19.    vUsedInPull := false;
  20.    vMsgVisible := false;
  21.    vSubActive := false;
  22.    vMenuHiHot := LookTOT^.MenuHiHot;
  23.    vMenuHiNorm := LookTOT^.MenuHiNorm;
  24.    vMenuLoHot := LookTOT^.MenuLoHot;
  25.    vMenuLoNorm := LookTOT^.MenuLoNorm;
  26.    vMenuOff := LookTOT^.MenuOff;
  27.    vPickOff := true;
  28.    vGap := 2;
  29.    vWidth := 0;
  30.    vX := 0;
  31.    vY := 0;
  32.    vMsgX := 0;
  33.    vMsgY := Monitor^.Depth;
  34.    vHelpKey := 315;
  35.    vhelpHook := NoHelpHook;
  36. end; {BaseMenuOBJ.Init}
  37.  
  38. function BaseMenuOBJ.ItemPtr(Item:byte): MenuItemPtr;
  39. {}
  40. var 
  41.    Temp: MenuItemPtr;
  42.    I: integer;
  43. begin
  44.    if (Item < 1) or (Item > vTotalItems) then
  45.       ItemPtr := nil
  46.    else
  47.    begin
  48.       Temp := vItemStack;
  49.       if Item > 1 then
  50.          for I := 2 to Item do
  51.              if Temp <> nil then
  52.                 Temp := Temp^.NextNode;
  53.       ItemPtr := Temp;
  54.    end;
  55. end; {BaseMenuOBJ.ItemPtr}
  56.  
  57. function BaseMenuOBJ.FirstActiveItem: byte;
  58. {}
  59. var 
  60.    Temp: MenuItemPtr;
  61.    I: integer;
  62. begin
  63.    Temp := vItemStack;
  64.    if Temp = nil then
  65.       FirstActiveItem := 0
  66.    else
  67.    begin
  68.       I := 1;
  69.       while (Temp <> nil) and (Temp^.Active = false) do
  70.       begin
  71.          inc(I);
  72.          Temp := Temp^.NextNode;
  73.       end;
  74.       FirstActiveItem := I;
  75.    end;
  76. end; {BaseMenuOBJ.FirstActiveItem}
  77.  
  78. procedure BaseMenuOBJ.AddFullItem(Txt:StrVisible; ID,HK:word; Msg:StrVisible; SubM:BaseMenuPtr);
  79. {}
  80. begin
  81.    AddItem(Txt);
  82.    SetID(vTotalItems,ID);
  83.    SetHK(vTotalItems,HK);
  84.    SetMessage(vTotalItems,Msg);
  85.    SetSubMenu(vTotalItems,SubM);
  86. end; {BaseMenuOBJ.AddFullItem}
  87.  
  88. procedure BaseMenuOBJ.AddItem(Txt:StrVisible);
  89. {}
  90. var 
  91.    Temp: MenuItemPtr;
  92.    L : byte;
  93. begin
  94.    if MaxAvail < sizeof(vItemStack^)+succ(length(Txt)) then
  95.       exit
  96.    else
  97.    begin
  98.       if vItemStack = nil then
  99.       begin
  100.          getmem(vItemStack,sizeof(vItemStack^));
  101.          vActiveItem := 1;
  102.          Temp := vItemStack;
  103.       end
  104.       else
  105.       begin
  106.          Temp := ItemPtr(vTotalItems);
  107.          getmem(Temp^.NextNode, sizeof(Temp^));
  108.          Temp := Temp^.NextNode;
  109.       end;
  110.       Temp^.NextNode := nil;
  111.       inc(vTotalItems);
  112.       with Temp^ do
  113.       begin
  114.          L := succ(length(Txt));
  115.          if L = 1 then
  116.            TxtPtr := nil
  117.          else
  118.          begin
  119.             if MemAvail >=  L then
  120.             begin
  121.                getmem(TxtPtr,L);
  122.                move(Txt[0],TxtPtr^,L);
  123.             end;
  124.          end;  
  125.          MsgPtr := nil;
  126.          HK :=  0;
  127.          ID := 0;
  128.          if (Txt = '-') or (Txt = '=') or (Txt = '') then
  129.             Active := false
  130.          else
  131.             Active := true;
  132.          SubMenu := nil;
  133.       end;
  134.       L := length(strip('A',Screen.HiMarker,Txt));
  135.       if L > vWidth then
  136.          vWidth := L;
  137.    end;
  138. end; {BaseMenuOBJ.AddItem}
  139.  
  140. procedure BaseMenuOBJ.SetTopic(Item:byte; Txt:StrVisible);
  141. {}
  142. var 
  143.    Temp: MenuItemPtr;
  144.    L: byte;
  145. begin
  146.    Temp := ItemPtr(Item);
  147.    if Temp <> nil then
  148.    begin
  149.       if Temp^.TxtPtr <> nil then
  150.       begin
  151.          move(Temp^.TxtPtr^,L,1);
  152.          freemem(Temp^.TxtPtr,L);
  153.       end;
  154.       L := succ(length(Txt));
  155.       if memavail >= L then
  156.       begin
  157.          if L = 1 then
  158.            Temp^.TxtPtr := nil
  159.          else
  160.          begin
  161.             getmem(Temp^.TxtPtr,L);
  162.             move(Txt[0],Temp^.TxtPtr^,L);
  163.          end;
  164.       end;
  165.    end;
  166. end; {BaseMenuOBJ.SetTopic}
  167.  
  168. procedure BaseMenuOBJ.SetMessage(Item:byte; Msg:StrVisible);
  169. {}
  170. var 
  171.    Temp: MenuItemPtr;
  172.    L: byte;
  173. begin
  174.    Temp := ItemPtr(Item);
  175.    if Temp <> nil then
  176.    begin
  177.       if Temp^.MsgPtr <> nil then
  178.       begin
  179.          move(Temp^.MsgPtr^,L,1);
  180.          freemem(Temp^.MsgPtr,L);
  181.       end;
  182.       L := succ(length(Msg));
  183.       if memavail >= L then
  184.       begin
  185.          if L = 1 then
  186.            Temp^.MsgPtr := nil
  187.          else
  188.          begin
  189.             getmem(Temp^.MsgPtr,L);
  190.             move(Msg[0],Temp^.MsgPtr^,L);
  191.          end;
  192.       end;
  193.    end;
  194. end; {BaseMenuOBJ.SetMessage}
  195.  
  196. procedure BaseMenuOBJ.SetHK(Item:byte; HK:word);
  197. {}
  198. var Temp: MenuItemPtr;
  199. begin
  200.    Temp := ItemPtr(Item);
  201.    if Temp <> nil then
  202.       Temp^.HK := HK;
  203. end; {BaseMenuOBJ.SetHK}
  204.  
  205. procedure BaseMenuOBJ.SetID(Item:byte; ID:word);
  206. {}
  207. var Temp: MenuItemPtr;
  208. begin
  209.    Temp := ItemPtr(Item);
  210.    if Temp <> nil then
  211.       Temp^.ID := ID;
  212. end; {BaseMenuOBJ.SetID}
  213.  
  214. procedure BaseMenuOBJ.SetStatus(Item:byte; On:boolean);
  215. {}
  216. var Temp: MenuItemPtr;
  217. begin
  218.    Temp := ItemPtr(Item);
  219.    if Temp <> nil then
  220.       Temp^.Active := On;
  221. end; {BaseMenuOBJ.SetStatus}
  222.  
  223. procedure BaseMenuOBJ.SetSubMenu(Item:byte;SubMenu:BaseMenuPtr);
  224. {}
  225. var 
  226.   Temp: MenuItemPtr;
  227.   L: byte;
  228.   Str: StrVisible;
  229. begin
  230.    Temp := ItemPtr(Item);
  231.    if Temp <> nil then
  232.    begin
  233.       Temp^.SubMenu := SubMenu;
  234.       Str := GetText(Temp);
  235.       L := succ(length(strip('A',Screen.HiMarker,Str)));
  236.       if L > vWidth then
  237.          vWidth := L;
  238.    end;
  239. end; {BaseMenuOBJ.SetSubMenu}
  240.  
  241. procedure BaseMenuOBJ.SetGap(G:byte);
  242. {}
  243. begin
  244.    vGap := G;
  245. end; {BaseMenuOBJ.SetGap}
  246.  
  247. procedure BaseMenuOBJ.SetActiveItem(Item:byte);
  248. {}
  249. begin
  250.    if Item in [1..vTotalItems] then
  251.       vActiveItem := Item;
  252. end; {BaseMenuOBJ.SetActiveItem}
  253.  
  254. procedure BaseMenuOBJ.SetMessageXY(X,Y:byte);
  255. {}
  256. begin
  257.    vMsgX := X;
  258.    vMsgY := Y;
  259. end; {BaseMenuOBJ.SetMessageXY}
  260.  
  261. procedure BaseMenuOBJ.SetMenuXY(X,Y:byte);
  262. {}
  263. begin
  264.    vX := X;
  265.    vY := Y;
  266. end; {BaseMenuOBJ.SetMenuXY}
  267.  
  268. procedure BaseMenuOBJ.SetHelpKey(K:word);
  269. {}
  270. begin
  271.    vHelpKey := K;
  272. end; {BaseMenuOBJ.SetHelpKey}
  273.  
  274. procedure BaseMenuOBJ.SetAllowEsc(On:boolean);
  275. {}
  276. begin
  277.    vAllowEsc := On;
  278. end; {BaseMenuOBJ.SetAllowEsc}
  279.  
  280. procedure BaseMenuOBJ.SetColors(HiHot,HiNorm,LoHot,LoNorm,Off:byte);
  281. {}
  282. begin
  283.    vMenuHiHot := HiHot;
  284.    vMenuHiNorm := HiNorm;
  285.    vMenuLoHot := LoHot;
  286.    vMenuLoNorm := LoNorm;
  287.    vMenuOff := Off;
  288. end; {BaseMenuOBJ.SetColors}
  289.  
  290. function BaseMenuOBJ.GetAllowEsc: boolean;
  291. {}
  292. begin
  293.    GetAllowEsc := vAllowEsc;
  294. end; {BaseMenuOBJ.GetAllowEsc}
  295.  
  296. function BaseMenuOBJ.GetText(Ptr:MenuItemPtr): StrVisible;
  297. {}
  298. var 
  299.   Str: StrVisible;
  300.   L : byte;
  301. begin
  302.    Str := '';
  303.    if Ptr <> nil then
  304.       if Ptr^.TxtPtr <> nil then
  305.       begin
  306.          move(Ptr^.TxtPtr^,L,1);
  307.          if L > 0 then
  308.             move(Ptr^.TxtPtr^,Str,succ(L));
  309.       end;
  310.    GetText := Str;
  311. end; {BaseMenuOBJ.GetText}
  312.  
  313. function BaseMenuOBJ.GetMessage(Ptr:MenuItemPtr): StrVisible;
  314. {}
  315. var 
  316.   Str: StrVisible;
  317.   L : byte;
  318. begin
  319.    Str := '';
  320.    if Ptr <> nil then
  321.       if Ptr^.MsgPtr <> nil then
  322.       begin
  323.          move(Ptr^.MsgPtr^,L,1);
  324.          if L > 0 then
  325.             move(Ptr^.MsgPtr^,Str,succ(L));
  326.       end;
  327.    GetMessage := Str;
  328. end; {BaseMenuOBJ.GetMessage}
  329.  
  330. function BaseMenuOBJ.GetID(Item:byte):word;
  331. {}
  332. var Temp: MenuItemPtr;
  333. begin
  334.    Temp := ItemPtr(Item);
  335.    if Temp <> nil then
  336.       GetID := Temp^.ID
  337.    else
  338.       GetID := 0;
  339. end; {BaseMenuOBJ.GetID}
  340.  
  341. function BaseMenuOBJ.GetHelpID:word;
  342. {}
  343. var 
  344.   Temp: MenuItemPtr;
  345.    Sub: BaseMenuPtr;
  346. begin
  347.    Temp := ItemPtr(vActiveItem);
  348.    if Temp <> nil then
  349.    begin
  350.       Sub := Temp^.Submenu;
  351.       if (Sub <> nil) and vSubActive then
  352.          GetHelpID := Sub^.GetHelpID
  353.       else
  354.          GetHelpID := Temp^.ID;
  355.    end
  356.    else
  357.       GetHelpID := 0;
  358. end; {BaseMenuOBJ.GetHelpID}
  359.  
  360. function BaseMenuOBJ.GetActiveItem: byte;
  361. {}
  362. begin
  363.    GetActiveItem := vActiveItem;
  364. end; {BaseMenuOBJ.GetActiveItem}
  365.  
  366. function BaseMenuOBJ.GetTotalItems: byte;
  367. {}
  368. begin
  369.    GetTotalItems := vTotalItems;
  370. end; {BaseMenuOBJ.GetTotalItems}
  371.  
  372. procedure BaseMenuOBJ.DisplayAllItems;
  373. {}
  374. var
  375.   I: integer;
  376.   L,C,R: boolean;
  377.   X,Y:byte;
  378. begin
  379.    if vUsedInPull then
  380.    begin
  381.       for I := 1 to vTotalItems do
  382.           DisplayItem(I,false,false);
  383.       Mouse.Status(L,C,R,X,Y);
  384.       if L then
  385.          vPickOff := true
  386.       else
  387.       begin
  388.          DisplayItem(vActiveItem,true,true);
  389.          vPickOff := false;
  390.       end;
  391.    end
  392.    else
  393.       for I := 1 to vTotalItems do
  394.           DisplayItem(I,vActiveItem=I,vActiveItem=I);
  395. end; {BaseMenuOBJ.DisplayAllItems}
  396.  
  397. procedure BaseMenuOBJ.TurnPickOff;
  398. {}
  399. var
  400.    Sub: BaseMenuPtr;
  401. begin
  402.    if vUsedInPull and vSubActive then
  403.    begin
  404.       Sub := ItemPtr(vActiveItem)^.SubMenu;
  405.       if Sub <> nil then
  406.          Sub^.Remove;
  407.       vSubActive := false
  408.    end;
  409.    vPickOff := true;
  410.    DisplayItem(vActiveItem,false,true);
  411. end; {BaseMenuOBJ.TurnPickOff}
  412.  
  413. function BaseMenuOBJ.GetPickOff: boolean;
  414. {}
  415. begin
  416.    GetPickOff := vPickOff;
  417. end; {BaseMenuOBJ.GetPickOff}
  418.  
  419. function BaseMenuOBJ.GetSubActive: boolean;
  420. {}
  421. begin
  422.    GetSubActive := vSubActive;
  423. end; {BaseMenuOBJ.GetSubActive}
  424.  
  425. procedure BaseMenuOBJ.ChangeActiveItem(New:byte);
  426. {}
  427. begin
  428.    if (New <> vActiveItem) or vPickOff then
  429.    begin
  430.       DisplayItem(vActiveItem,false,true);
  431.       vActiveItem := New;
  432.       DisplayItem(vActiveItem,true,true);
  433.       vPickOff := false;
  434.    end;
  435. end; {BaseMenuOBJ.ChangeActiveItem}
  436.  
  437. function BaseMenuOBJ.HotkeySelect(K:word): boolean;
  438. {}
  439. var
  440.    I : byte;
  441.    Temp: MenuItemPtr;
  442. begin
  443.    Temp := vItemStack;
  444.    I := 1;
  445.    if (K > 96) and (K <123) then
  446.       K := K - 32;
  447.    while Temp <> Nil do
  448.    begin
  449.       if (Temp^.HK = K) and Temp^.Active then
  450.       begin
  451.          if I <> vActiveItem then
  452.             ChangeActiveItem(I);
  453.          HotKeySelect := true;
  454.          exit;
  455.       end
  456.       else
  457.       begin
  458.          Temp := Temp^.NextNode;
  459.          inc(I);
  460.       end;   
  461.    end;
  462.    HotKeySelect := false;
  463. end; {BaseMenuOBJ.HotkeySelect}
  464.  
  465. function BaseMenuOBJ.AddPre(Txt:StrVisible;Hi:boolean):StrVisible;
  466. {}
  467. var Pre : Char;
  468. begin
  469.    Pre := LookTOT^.ListLeftChar;
  470.    if Pre <> #0 then
  471.    begin
  472.       if Hi then 
  473.          Txt := Pre+Txt
  474.       else
  475.          Txt := ' '+Txt;
  476.    end;
  477.    AddPre := Txt;
  478. end; {BaseMenuOBJ.AddPre}
  479.  
  480. function BaseMenuOBJ.AddSuf(Txt:StrVisible;Hi:boolean):StrVisible;
  481. {}
  482. var Suf : Char;
  483. begin
  484.    Suf := LookTOT^.ListRightChar;
  485.    if Suf <> #0 then
  486.    begin
  487.       if Hi then 
  488.          Txt := Txt+Suf
  489.       else
  490.          Txt := Txt+' ';
  491.    end;
  492.    AddSuf := Txt;
  493. end; {BaseMenuOBJ.AddSuf}
  494.  
  495. procedure BaseMenuOBJ.DisposeItems;
  496. {}
  497. var 
  498.    Tmp1,Tmp2: MenuItemPtr;
  499.    L : byte;
  500. begin
  501.    Tmp1 := vItemStack;
  502.    while Tmp1 <> nil do
  503.    begin
  504.       Tmp2 := Tmp1^.NextNode;
  505.       if Tmp1^.TxtPtr <> Nil then
  506.       begin
  507.          move(Tmp1^.TxtPtr^,L,1);
  508.          freemem(Tmp1^.TxtPtr,succ(L));
  509.       end;
  510.       if Tmp1^.MsgPtr <> Nil then
  511.       begin
  512.          move(Tmp1^.MsgPtr^,L,1);
  513.          freemem(Tmp1^.MsgPtr,succ(L));
  514.       end;
  515.       freemem(Tmp1,sizeof(Tmp1^));
  516.       Tmp1 := Tmp2;
  517.    end;
  518.    vItemStack := nil;
  519.    vTotalItems := 0;
  520.    vActiveItem := 0;
  521. end; {BaseMenuOBJ.DisposeItems}
  522.  
  523. procedure BaseMenuOBJ.ChangeMessage(Item:byte; Hi:boolean);
  524. {}
  525. var
  526.    Temp: MenuItemPtr;
  527.    Txt: StrVisible;
  528.    WinWasActive: boolean;
  529.    Col: byte;
  530. begin
  531.    Temp := ItemPtr(Item);
  532.    Txt := GetMessage(Temp);          
  533.    Col := IOTOT^.MessageCol;
  534.    if Txt <> '' then
  535.    begin
  536.       WinWasActive := Screen.WindowOff;
  537.       if Hi then
  538.       begin
  539.          if vMsgX = 0 then
  540.             Screen.WriteCenter(vMsgY,Col,Txt)
  541.          else
  542.             Screen.WriteAT(vMsgX,vMsgY,Col,Txt);
  543.          vMsgVisible := true;
  544.       end
  545.       else
  546.       begin
  547.          if vMsgX = 0 then
  548.             Screen.WriteCenter(vMsgY,Col,replicate(length(Txt),' '))
  549.          else
  550.             Screen.WriteAT(vMsgX,vMsgY,Col,replicate(length(Txt),' '));
  551.          vMsgVisible := false;
  552.       end;
  553.       Screen.WindowOn;
  554.    end;
  555. end; {BaseMenuOBJ.ChangeMessage}
  556.  
  557. function BaseMenuOBJ.LastKey: word;
  558. {}
  559. begin
  560.    LastKey := vLastKey;
  561. end; {BaseMenuOBJ.LastKey}
  562.  
  563. procedure BaseMenuOBJ.SetHelpHook(Proc:HelpProc);
  564. {}
  565. begin
  566.    vHelpHook := Proc;
  567. end; {BaseMenuOBJ.SetHelpHook}
  568.  
  569. procedure BaseMenuOBJ.HelpTask(ID:word);
  570. {}
  571. begin
  572.    vHelpHook(ID);
  573. end; {BaseMenuOBJ.HelpTask}
  574.  
  575. procedure BaseMenuOBJ.SetForPull;
  576. {abstract} begin end; 
  577.  
  578. procedure BaseMenuOBJ.DisplayItem(Item:byte;Hi,Msg:boolean);                
  579. {abstract} begin end; 
  580.  
  581. procedure BaseMenuOBJ.Remove;                
  582. {abstract} begin end; 
  583.  
  584. function BaseMenuOBJ.Activate: word;        
  585. {abstract} begin end; 
  586.  
  587. procedure BaseMenuOBJ.DrawEngine(eX,eY:byte);
  588. {abstract} begin end; 
  589.  
  590. function BaseMenuOBJ.TargetPick(X,Y:byte):byte;
  591. {abstract} begin end; 
  592.  
  593. function BaseMenuOBJ.ProcessKey(K:word; X,Y:byte):word;
  594. {abstract} begin end; 
  595.  
  596. function BaseMenuOBJ.MenuZone(X,Y:byte):boolean;
  597. {abstract} 
  598. begin 
  599.    MenuZone := false;
  600. end; {BaseMenuOBJ.MenuZone}
  601.  
  602. destructor BaseMenuOBJ.Done;
  603. {}
  604. begin
  605.    DisposeItems;
  606. end; {BaseMenuOBJ.Done}